#include "cli/ls/Ls.h"
#include "FileUtils.h"
#include <iostream>
#include "NodeHandler.h"
#include <string.h>
#include "globalinfo.h"
namespace Cli::Ls {
    void fun(std::vector<std::string> &args) {
        Path path = globalInfo.path;
        if (args.size() > 1) {                                          //  读取命令行参数，拼接到路径中
            path.append(args[1].c_str());
        }

        // 发起task请求
        SocketIO sio = nodeHandler.launchTask(TaskFlag::ls, path.getPath().c_str(), path.getPath().length());
        FileInfo finfo;
        char buf[8192];                                                 //  Socket读取缓存
        unsigned long long len = sio.socketReader->getFrameLength();    //  待接收数据长度
        int rec;                                                        //  一次读取的长度
        FILE *fp = fdopen(sio.getSocketFD(), "r");                      //  为了方便使用fgets从socket描述符读取一行的数据，需要使用fdopen整一个与socket对应的文件流（FILE）
        while ( len > 0 ) {                                             //  当待接收长度大于0时
            fgets(buf, 8192, fp);                                       //  读取一行到缓存
            rec = strlen(buf);                                          //  取字符串长度
            len -= rec;                                                 //  更新待接收长度
            buf[rec-1] = 0;                                             //  去除换行符
            FileInfo::parse(buf, finfo);                                //  对序列化的文件信息字符串进行解析
            std::cout << finfo.toStandardStr() << std::endl;            //  输出
        }
        fclose(fp);
        sio.close();
    }
}
MAKE_CLI_EXECUTOR(Ls, "ls", "show file list", {
    Cli::Ls::fun(args);
})
